package com.xf.io.byteStream;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;

public class ByteStreamTest {
    public static void main(String[] args) throws IOException {

        // 文件路径(我们使用绝对路径)
        // 相对路径
        // String filePath = "java-se\\src\\main\\java\\com\\xf\\io\\byteStream";
        // 绝对路径
        String filePath = "E:\\AppData\\Downloads\\";
        // 输入流/输出流文件名
        String isName = "鬼灭之刃.mp4";
        String osName = "鬼灭之刃1.mp4";
    /*
        // 输入流对象
        InputStream is = new FileInputStream(filePath + isName);
        // 获取输出流对象
        OutputStream os = new FileOutputStream(filePath + osName,true);


        // 单字节写入的方法
        // oneByteStream(is, os);

        // 字节数组写入的
        bacthByteStream(is, os);


        // 关闭资源
        is.close();
        os.close();
    */

        // 上面的方法有问题,会导致复制文件不对
        try (
                // 输入流对象
                InputStream is = new FileInputStream(filePath + isName);
                // 获取输出流对象
                //如果是复制文件的功能不要使用追加的方式
                OutputStream os = new FileOutputStream(filePath + osName);
        ) {
            // 单字节写入的方法
            // oneByteStream(is, os);
            // 字节数组写入的
            bacthByteStream(is, os);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 字节数组写入
     *
     * @param is 输入流(读取文件)
     * @param os 输出流(往文件写数据)
     */

    private static void bacthByteStream(InputStream is, OutputStream os) throws IOException {
        byte[] bys = new byte[1024]; // 1024及其整数倍
        int len;
        while ((len = is.read(bys)) != -1) {
            System.out.println("bys[] = " + bys);
            os.write(bys, 0, len);
        }
    }

    /**
     * 文件越大越慢的
     *
     * @param is 输入流(读取文件)
     * @param os 输出流(往文件写数据)
     */
    private static void oneByteStream(InputStream is, OutputStream os) throws IOException {
        int len;
        while ((len = is.read()) != -1) {
            // 打印写入的字节
            System.out.println(len);
            os.write(len);
        }
    }
}
